package com.xjx.handler;

import com.xjx.common.Result;
import com.xjx.enums.ErrorCode; // 确保导入 ErrorCode
import com.xjx.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;


/**
 * @Author: mqxu
 * @Date: 2025/9/19
 * @Description: 业务异常处理器
 * AOP 切面处理
 */
@RestControllerAdvice
@Slf4j
public class BusinessExceptionHandler {

    /**
     * 处理自定义的业务异常 (BusinessException)
     * 这个处理器会优先匹配
     * @param e BusinessException
     * @return Result
     */
    @ExceptionHandler(BusinessException.class)
    public Result<?> handleBusinessException(BusinessException e) {
        // 使用 warn 级别日志记录业务异常，因为它通常是可预期的
        log.warn("业务异常 -> Code: {}, Message: {}", e.getCode(), e.getMsg());
        return Result.error(e.getCode(), e.getMsg());
    }

    /**
     * 处理所有其他未被捕获的异常 (Exception)
     * 这个处理器是最后的防线
     * @param e Exception
     * @return Result
     */
    @ExceptionHandler(Exception.class)
    public Result<?> handleOtherExceptions(Exception e) {
        // 使用 error 级别日志记录未知系统异常，并打印完整堆栈信息
        log.error("系统未知异常: {}", e.getMessage(), e);
        // 向前端返回一个通用的、模糊的服务器错误提示
        return Result.error(ErrorCode.INTERNAL_SERVER_ERROR);
    }
}